package br.com.equus.entidade;

import static javax.persistence.GenerationType.IDENTITY;

import java.io.InputStream;
import java.sql.Blob;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

import org.hibernate.envers.Audited;
import org.hibernate.envers.NotAudited;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

import br.com.arquitetura.entidade.Entidade;
import br.com.arquitetura.excecao.ExcecaoUtil;

@Entity
@Table(name = "EQ_IMAGEM_ANIMAL", catalog = "EQUUS")
@Audited
public class ImagemAnimal extends Entidade<Integer> {

	private static final long serialVersionUID = 1672623418230516458L;

	@Id
	@Column(name = "ID_IMG_ANIMAL", unique = true, nullable = false)
	@GeneratedValue(strategy = IDENTITY)
	private Integer id;

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "ID_ANIMAL", referencedColumnName = "ID_ANIMAL", nullable = false)
	private Animal animal;

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "DT_CADASTRO", nullable = false)
	private Date dtCadastro;

	@NotAudited
	@Column(name = "IMG_FOTO", nullable = false, columnDefinition = "LONGBLOB")
	private Blob imagem;

	@Column(name = "TP_FOTO", nullable = false)
	private String tipoImagem;

	@Column(name = "DSC_FOTO", nullable = false)
	private String nomeImagem;

	@Transient
	private StreamedContent content;

	public ImagemAnimal() {
	}

	public ImagemAnimal(Integer id) {
		this.id = id;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public Animal getAnimal() {
		return animal;
	}

	public void setAnimal(Animal animal) {
		this.animal = animal;
	}

	public Date getDtCadastro() {
		return dtCadastro;
	}

	public void setDtCadastro(Date dtCadastro) {
		this.dtCadastro = dtCadastro;
	}

	public Blob getImagem() {
		return imagem;
	}

	public void setImagem(Blob imagem) {
		this.imagem = imagem;
	}

	public String getTipoImagem() {
		return tipoImagem;
	}

	public void setTipoImagem(String tipoImagem) {
		this.tipoImagem = tipoImagem;
	}

	public String getNomeImagem() {
		return nomeImagem;
	}

	public void setNomeImagem(String nomeImagem) {
		this.nomeImagem = nomeImagem;
	}

	public StreamedContent getContent() {
		try {
			InputStream is = imagem.getBinaryStream();
			content = new DefaultStreamedContent(is, tipoImagem, this.getNomeImagem());
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}
		return content;
	}

	public void setContent(StreamedContent content) {
		this.content = content;
	}

}
